home *** CD-ROM | disk | FTP | other *** search
- _FLETCHER'S CHECKSUM_
- by John Kodis
-
-
- Example 1:
-
- (a)
-
- integer i, sum1, sum2;
-
- sum1 = 0;
- sum2 = 0;
- for i from 1 to message_length do
- sum1 = ( sum1 + message[i] ) modulo 255;
- sum2 = ( sum2 + sum1 ) modulo 255;
- end for.
-
-
- (b)
-
- check1 = 255 - (( sum1 + sum2 ) modulo 255);
- message[message_length+1] = check1;
- check2 = 255 - (( sum1 + check1 ) modulo 255);
- message[message_length+2] = check2;
-
-
-
-
- Example 2:
-
-
- (a)
-
- register unsigned char *ptr;
- register short int i, len, sum1, sum2;
-
- sum1 = sum2 = 0;
- for (i=0; i<len; i++)
- {
- sum1 += *ptr++;
- if (sum1 >= 255) sum1 -= 255;
- sum2 += sum1;
- if (sum2 >= 255) sum2 -= 255;
- }
-
-
- (b)
-
- moveq #0,d5
- move.w d5,d4 ;sum1 = sum2 = 0;
- moveq #0,d6
- bra.s L_29 ;for(i=0; i<len; i++) {
- L_28 moveq #0,d0
- move.b (a3)+,d0
- add.w d0,d4 ; sum1 += *ptr++;
- cmp.w #255,d4
- blt.s L_32
- sub.w #255,d4 ; if(sum1 >= 255) sum1 -= 255;
- L_32 add.w d4,d5 ; sum2 += sum1;
- cmp.w #255,d5
- blt.s L_36
- sub.w #255,d5 ; if(sum2 >= 255) sum2 -= 255;
- L_36 addq.w #1,d6
- L_29 cmp.w d7,d6
- blt.s L_28 ;}
-
-
-
- Example 3:
-
- (a)
- register unsigned char *ptr;
- register short int sum1, len;
- register unsigned long int sum2;
-
- sum1 = sum2 = 0;
- while (len--)
- {
- sum1 += *ptr++;
- if (sum1 >= 255) sum1 -= 255;
- sum2 += sum1;
- }
- sum2 %= 255;
-
- (b) loop moveq #0,d3
- move.b (a3)+,d3
- add.w d3,d0 ; sum1 += *ptr++;
-
- cmp.w #255,d0
- blt.s no sub
- sub.w #255,d0 ; if (sum1 >= 255) sum1 -= 255;
-
- no_sub add.1 d0,d1 ; sum2 += sum1;
- dbra d2,loop ; while (len--);
-
-
-
- Example 4:
-
- ; Register Usage
- ; D0 the first checksum value (sum1)
- ; D1 the second checksum value (sum2)
- ; D2 the length in bytes of the buffer (len)
- ; D4 contains zero, for the addx.b instructions
- ; A0 pointer into the buffer (ptr)
-
- loop add.b (a0)+,d0 ; sum1 += *ptr++;
- addx.b d4,d0 ; if (sum1 >= 256) sum1 += 1;
- add.l d0,d1 ; sum2 += sum1;
- dbra d2,loop ; while (len--);
-
-